// 专门存储函数程序的 外部js文件

/*
验证码函数 生成随机验证码
参数1: 验证码内容 默认是 阿拉伯数字+小写英文字母+大写英文字母
参数2: 验证码位数 默认是 6位验证码
参数3: 验证码内容是否重复 默认是true不能重复  可以设定false可以重复
*/ 
function setVC( string = '0123456789abcdefghijklmnopqrstuvwxyzABCEDFGHIJKLMNOPQRSTUVWXYZ' , num = 6 , bool = true ){
    // 定义变量 存储 验证码内容
    var vc = '';

    // 通过循环,生成随机索引下标,拼接随机字符,生成验证码
    while(vc.length !== num){
        // 生成 随机验证码
        var index = parseInt( Math.random() * string.length );

        if( bool ){
            // 如果 bool 是 true 是不能重复 要 验证判断才能拼接写入
            if( vc.indexOf( string[index] ) === -1 ){
                vc += string[index];
            }
        }else{
            // 如果 bool 是 false 可以重复 直接拼接
            vc += string[index];
        }
    }

    // 返回值是 生成的随机验证码字符串
    return vc;
}

/*
获取时间差输出倒计时结果
参数: 终止时间 字符串
*/ 
function getCountDown(end){
    // 获取起始时间对象也就是当前时间对象
    var startTime = new Date();

    // 获取终止时间对象
    var endTime = new Date(end);

    // 计算时间差秒数
    var t = parseInt( ( endTime.getTime() - startTime.getTime()  ) / 1000 );

    // 转化为 天 小时 分 秒
    // 天
    var d = parseInt( t / ( 24*60*60 ) );
    // 前导补零
    d = d < 10 ? '0' + d : d;

    // 小时
    var h = parseInt( ( t % ( 24*60*60 ) ) / ( 60*60 ) );
    // 前导补零
    h = h < 10 ? '0' + h : h;

    // 分钟
    var m = parseInt( ( t % ( 60*60 ) ) / 60 );
    // 前导补零
    m = m < 10 ? '0' + m : m;

    // 秒
    var s = t % 60;
    // 前导补零
    s = s < 10 ? '0' + s : s;

    // 返回数据
    return { day:d , hour:h , minute:m , second:s }
}

/*
随机颜色 rgb
*/
function setRGB(){
    return `rgb(${parseInt(Math.random()*256)},${parseInt(Math.random()*256)},${parseInt(Math.random()*256)})`;
}


/*
随机颜色 rgba
*/
function setRGBA(){
    return `rgba(${parseInt(Math.random()*256)},${parseInt(Math.random()*256)},${parseInt(Math.random()*256)},${ parseInt(Math.random()*11)/10 })`;                         
}


/*
获取标签对象css样式属性值兼容函数
参数1: 标签对象
参数2: css属性
*/
function myGetStyle(element , type){
    if( window.getComputedStyle ){
        // 如果有 window.getComputedStyle 这个方法 证明是 标准浏览器
        // 通过 window.getComputedStyle 这个方法 获取 标签指定属性的属性值
        // 并且 最终返回 获取的属性值结果
        // .语法 不解析变量 之前是 window.getComputedStyle(标签对象).属性
        // 现在必须要写成 window.getComputedStyle(标签对象)[属性参数];
        return window.getComputedStyle(element)[type];
    }else{
        // 如果没有 window.getComputedStyle 这个方法 证明是 低版本IE浏览器
        // 通过 标签对象.currentStyle.属性 来 获取 标签对象css样式属性值
        // 点语法 不解析变量 必须使用 标签对象.currentStyle[属性参数]
        return element.currentStyle[type];    
    }
}


/*
获取浏览器地址栏 携带参数
将浏览器地址栏中携带的参数 转化为 对象语法形式
*/
function myGetUrlValObj(){
        // 创建对象 存储 携带参数
        var obj = {};

        // 获取 url地址携带参数字符串 不要?问号
        var str = window.location.search.substr(1);

        // 将 字符串 以 & 符号为间隔 分割为 数组
        var arr1 = str.split('&');

        // 循环遍历数组 获取 每一个数组单元数据 也就是 键值对字符串
        arr1.forEach(function(item){
            // 将键值对字符串 以等号为间隔 再次 分割为 数组 
            var arr2 = item.split('=');
            // 数组索引0 单元 是 键名
            // 数组索引1 单元 是 键值 键值要 还原为 对应的 数值/中文/符号
            obj[ arr2[0] ] = window.decodeURIComponent( arr2[1] );

        })

        // 返回这个对象
        return obj;
}

/*
运动函数
可以实现多属性 同时运动 可以 兼容透明度
运动结束 执行对应的 回调函数
参数1: 运动的标签对象
参数2: 对象形式 运动的css属性 和 运动的最终值
参数3: 运动结束的 回调函数 默认值 是 空函数
定时器的时间间隔 最小 建议写 20
一般显示器 刷新频率是 60赫兹 也就是 1秒刷新60次 也就是 1次 16.6666... 毫秒
*/
function move( element , object , callback = function(){} ){
    // 1, 定义变量 储存 定时器个数
    let num = 0;

    // 2, 循环遍历 参数2 对象
    // 变量必须是用let声明 变量储存 运动的属性 object[type] 储存 最终值
    for( let type in object){
        // 2-1 变量累加1 证明生成一个定时器
        num++;

        // 2-2 获取最终值 兼容透明度
        let endVal = type === 'opacity' ? object[type]*100 : object[type];

        // 2-3 定义 定时器 
        // 储存定时器序号的变量 必须是let声明
        let time = setInterval( function(){
            // 2-3-1 获取 当前属性 对应的 当前 初始值 兼容透明度
            let startVal = type === 'opacity' ? myGetStyle( element , type )*100 : parseInt( myGetStyle( element , type ) ); 

            // 2-3-2 计算步长
            let step = ( endVal - startVal ) / 10;

            // 2-3-3 步长取整 
            // 大于 0 向上取整  小于 0 向下取整
            step = step > 0 ? Math.ceil( step ) :  Math.floor( step );

            // 2-3-4 初始值 累加 步长
            startVal += step;

            // 2-3-5 赋值 对应的属性 兼容 透明度
            element.style[type] = type === 'opacity' ? startVal / 100 : startVal + 'px';

            // 2-3-6 判断 如果 startVal 等于 最终值 endVal 清除定时器
            // 同时 给 变量 -1 表示清除了 定时器
            if( startVal === endVal ){
                // 清除定时器
                clearInterval( time );
                // 变量-- 表示 有一个定时器终止了
                num--;

                // 2-3-7 如果 num 是 0 表示所有定时器都清除了
                // 可以执行回调函数
                if( num === 0 ){
                    callback();
                }                
            }
        } , 20 );
    }  
}
